#include "StringTool.h"
#include <string.h>
#include <sstream>
static inline bool isWhitespace(char c){
    return std::isspace(static_cast<unsigned char>(c));
}

std::string StringTool::getString(const char *str, bool bIsDeepCopy)
{
    if(!str)
        return std::string();
    auto len = strlen(str);
    if(bIsDeepCopy)
    {
        char *p = new char[len+1];
        memcpy(p,str,len+1);
        return std::string(p,len);
    }
    else
    {
        return std::string(str,len);
    }
}

std::string StringTool::trim(const std::string &str)
{
    size_t first = str.find_first_not_of(" \t\n\r\f\v");
    if (first == std::string::npos)
        return ""; // 没有非空白字符
    size_t last = str.find_last_not_of(" \t\n\r\f\v");
    return str.substr(first, (last - first + 1));
}

std::vector<std::string> StringTool::split(const std::string &str, char delim)
{
    if(str.empty())
        return std::vector<std::string>();
    std::stringstream ss(str);
    std::string delimiter;
    auto ans = std::vector<std::string>();
    while(std::getline(ss,delimiter,delim)){
        ans.emplace_back(delimiter);
    }
    return ans;
}

std::vector<std::string> StringTool::split(const std::string &str, const std::string &delim)
{
    std::vector<std::string> tokens;
    size_t start = 0, end = 0;
    while ((end = str.find(delim, start)) != std::string::npos) {
        tokens.push_back(str.substr(start, end - start));
        start = end + delim.length();
    }
    tokens.push_back(str.substr(start));
    return tokens;
}



// std::string StringTool::join(const std::vector<std::string> &strs,const std::string& delim)
// {
//     if (strs.size() > 0) {
//         std::string str;
//         for (auto it = strs.begin(); it != strs.end(); it++) {
//             str += *it;
//         }
//         str = str.substr(0, str.find_last_of(delim)+1);
//         return str;
//     }
//     return std::string();
// }

// std::string StringTool::join(const std::list<std::string> &strs,const std::string& delim)
// {
//      if (strs.size() > 0) {
//         std::string str;
//         for (auto it = strs.begin(); it != strs.end(); it++) {
//             str += *it;
//         }
//         str = str.substr(0, str.find_last_of(delim)+1);
//         return str;
//     }
//     return std::string();
// }
